// getName(); //5 函数提升优于变量提升

// function Foo() {
//   // 没有变量提升 全局变量 函数
//   getName = function() {
//     console.log(1);
//   };
//   return this; 
// }
// // 静态方法
// Foo.getName = function() {
//   console.log(2);
// };
// // 原型方法
// Foo.prototype.getName = function() {
//   console.log(3);
// };

// // 变量提升 函数表达式
// var getName = function() {
//   console.log(4);
// };
// getName(); // 4
// // 函数提升 函数声明
// function getName() {
//   console.log(5);
// }
// //请写出以下输出结果：
// Foo.getName(); // 2 静态方法
// getName(); // 4 全局函数覆盖 所以输出4
// Foo().getName(); // 1 此时的getName全局函数重新赋值，变成了输出1
// getName(); // 1 
// new Foo.getName(); // 2 相当于执行new (Foo.getName)();
// new Foo().getName(); // 3 实例对象没有getName 找原型上的 (new Foo()).getName()
// new new Foo().getName(); // 3 new ((new Foo()).getName)();


function Foo() {
  this.getName = function() {
    console.log(3);
    return {
      getName: getName //这个就是第六问中涉及的构造函数的返回值问题
    }
  }; //这个就是第六问中涉及到的，JS构造函数公有方法和原型链方法的优先级
  getName = function() {
    console.log(1);
  };
  return this
}
Foo.getName = function() {
  console.log(2);
};
Foo.prototype.getName = function() {
  console.log(6);
};
var getName = function() {
  console.log(4);
};

function getName() {
  console.log(5);
} //答案：
Foo.getName(); //2
getName(); //4
console.log(Foo()) // window
Foo().getName(); //1
getName(); //1
new Foo.getName(); //2
new Foo().getName(); //3
//多了一问
new Foo().getName().getName(); //3 1
new new Foo().getName(); //3         